package com.ruoyi.common.core.domain;

public class ApiResult<T>{

    private int code;// 状态码
    private String message;// 提示消息
    private T data;// 响应结果集数据

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    /**枚举类常量解析器
     * 快速解析枚举类常量信息，解析数据并放入到标准响应类ResponseData的属性中
     * @param enumCode
     */
    public void parserEnum(EnumCode enumCode) {
        this.code = enumCode.getCode();// 获取枚举常量的状态码，赋值给属性
        this.message = enumCode.getMessage();// 获取枚举常量的描述信息
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static ApiResult success()
    {
        return ApiResult.success("操作成功");
    }


    /**定义请求成功的：状态码，提示信息
     * @return 有成功状态码，提示信息
     */
    public static<T> ApiResult<T> success(String msg) {
        // 创建响应标准格式对象
        ApiResult<T> responseData = new ApiResult<T>();
        // 调用转换器方法，将（成功）枚举常量解析，放入到标准响应数据中。
        responseData.parserEnum(EnumCode.SUCCESS_MSG);
        responseData.setMessage(msg);
        return responseData;
    }

    /**定义请求成功的：状态码，提示信息
     * @return 有成功状态码，提示信息
     */
    public static<T> ApiResult<T> success(String msg,T data) {
        // 创建响应标准格式对象
        ApiResult<T> responseData = new ApiResult<T>();
        // 调用转换器方法，将（成功）枚举常量解析，放入到标准响应数据中。
        responseData.parserEnum(EnumCode.SUCCESS_MSG);
        responseData.setMessage(msg);
        // 放入响应数据
        responseData.setData(data);
        return responseData;
    }

    /**定义请求成功的：状态码，描述，结果集数据
     * @param data 传递的响应结果集数据
     * @return 有成功状态码，描述，结果集数据的标准格式对象
     */
    public static<T> ApiResult<T> success(T data) {
        // 创建响应标准格式对象
        ApiResult<T> responseData = new ApiResult<T>();
        // 调用转换器方法，将（成功）枚举常量解析，放入到标准响应数据中。
        responseData.parserEnum(EnumCode.SUCCESS);
        // 放入响应数据
        responseData.setData(data);
        return responseData;
    }

    /**
     * 返回错误消息
     *
     * @return
     */
    public static ApiResult error()
    {
        return ApiResult.error("操作失败");
    }


    /**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static ApiResult error(String msg)
    {
        return ApiResult.error(EnumCode.ERROR, msg);
    }

    /**定义请求失败的：
     * @param enumCode 失败时传递的常见错误枚举常量
     * @return 有失败状态码，描述，结果集可为null，也可为自定义异常信息
     */
    public static<T> ApiResult<T> error(EnumCode enumCode) {
        // 创建响应标准格式对象
        ApiResult<T> responseData = new ApiResult<T>();
        // 调用转换器方法，将（错误）枚举常量解析。
        responseData.parserEnum(enumCode);
        return responseData;
    }


    /**定义请求失败的：
     * @param enumCode 失败时传递的常见错误枚举常量
     * @return 有失败状态码，描述，结果集可为null，也可为自定义异常信息
     */
    public static<T> ApiResult<T> error(EnumCode enumCode, String message) {
        // 创建响应标准格式对象
        ApiResult<T> responseData = new ApiResult<T>();
        // 调用转换器方法，将（错误）枚举常量解析。
        responseData.parserEnum(enumCode);
        responseData.setMessage(message);
        return responseData;
    }

    /** 有成功，有失败，但是失败的状态描述不一定能全部满足需求（枚举类有限），所以，自定义方法实现自定义信息
     * @param code 自定义的状态码
     * @param message  自定义的错误信息
     * @return  有失败自定义状态码，自定义描述，结果集可为null，也可为自定义异常信息
     */
    public static<T> ApiResult<T> generator(int code, String message, T data) {
        // 创建响应标准格式对象
        ApiResult<T> responseData = new ApiResult<T>();
        responseData.setCode(code);
        responseData.setMessage(message);
        responseData.setData(data);
        return responseData;
    }

    public enum EnumCode {
        /** 成功无任何提示 */
        SUCCESS(200,"成功无任何提示"),
        /**成功并提示信息3秒内自动关闭*/
        SUCCESS_MSG(201,"成功并提示信息3秒内自动关闭"),
        /**成功并提示信息须用户点击确认后关闭*/
        SUCCESS_CONFIRM(202,"成功并提示信息须用户点击确认后关闭"),
        /**暂无数据*/
        SUCCESS_NO_DATA(300,"暂无数据"),
        /** 错误或失败 */
        ERROR(400,"错误或失败"),
        /**未注册用户*/
        NOT_REGISTER(600,"未注册"),
        /** 强制退出登录 */
        LOGIN_OUT(500,"强制退出登录"),
        /*无权限访问*/
        NOT_AUTHORITY(500,"暂无权限访问");

        // 定义的枚举常量属性。
        private int code;// 状态码
        private String message;// 描述

        /**
         * 私有构造,防止被外部调用
         */
        private EnumCode(int code, String message) {
            this.code = code;
            this.message = message;
        }
        /**
         * 定义方法,返回描述,跟常规类的定义get没区别
         * @return
         */
        public int getCode() {
            return code;
        }
        public String getMessage() {
            return message;
        }
    }

}


